import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  // state对象是Vuex存储中的核心部分，它包含了应用的所有状态
  state: {
    toolbar: JSON.parse(localStorage.getItem("toolbar") || '{"visible": false, "enter": true}'),  // 工具栏的可见状态和进入状态
    sortInfo: JSON.parse(localStorage.getItem("sortInfo") || '[]'),                               // 分类信息，包括每个分类的文章数量
    currentUser: JSON.parse(localStorage.getItem("currentUser") || '{}'),                         // 当前用户的信息
    currentAdmin: JSON.parse(localStorage.getItem("currentAdmin") || '{}'),                       // 当前管理员的信息
    sysConfig: JSON.parse(localStorage.getItem("sysConfig") || '{}'),                             // 系统配置信息
    // 网站信息，包括网站名称、标题、通知、随机封面、页脚、背景图片和头像
    webInfo: JSON.parse(localStorage.getItem("webInfo") || '{"webName": "", "webTitle": [], "notices": [], "randomCover": [], "footer": "", "backgroundImage": "", "avatar": ""}')
  },
  // getters对象用于从state中派生出一些状态
  getters: {
    articleTotal: state => {    // 计算所有分类的文章总数
      if (state.sortInfo !== null && state.sortInfo.length !== 0) {  // 如果分类不为空值
        if (state.sortInfo.length === 1) {
          return state.sortInfo[0].countOfSort;           // 如果文章分类数等于1则直接返回文章数量
        } else {  
          return state.sortInfo.reduce((prev, curr) => {  // 如果不等于1则将数组中的每个元素进行累加
            if (typeof prev === "number") {
              return prev + curr.countOfSort;
            } else {
              return prev.countOfSort + curr.countOfSort;
            }
          });
        }
      } else {  // 如果分类为空值则返回0
        return 0;
      }
    },
    navigationBar: state => {  // 获取导航栏的分类信息
      if (state.sortInfo !== null && state.sortInfo.length !== 0) {  // 检查state.sortInfo是否为null或者长度为0
        return state.sortInfo.filter(f => f.sortType === 0);         // 使用filter方法过滤出sortType等于0的元素。filter方法会遍历数组中的每个元素，并返回一个新数组
      } else {
        return [];
      }
    }
  },
  // mutations对象是唯一允许更新state的地方。每个mutation都有一个字符串的事件类型 (type) 和一个回调函数 (handler)
  // 这个回调函数的第一个参数是state，第二个参数是payload（可选），以下共定义了六个mutation
  mutations: {
    changeToolbarStatus(state, toolbarState) {   // 更新工具栏的状态，并将其保存到localStorage
      state.toolbar = toolbarState;
      localStorage.setItem("toolbar", JSON.stringify(toolbarState));
    },
    loadSortInfo(state, sortInfo) {  // 加载分类信息，并按优先级排序，然后保存到localStorage
      if (sortInfo !== null && sortInfo.length !== 0) {  // 检查sortInfo是否为null或者长度为0
        state.sortInfo = sortInfo.sort((s1, s2) => s1.priority - s2.priority);
        localStorage.setItem("sortInfo", JSON.stringify(sortInfo.sort((s1, s2) => s1.priority - s2.priority)));
      }
    },
    loadCurrentUser(state, user) {  // 加载当前用户信息，并保存到localStorage
      state.currentUser = user;
      localStorage.setItem("currentUser", JSON.stringify(user));
    },
    loadSysConfig(state, sysConfig) {  // 加载系统配置信息，并保存到localStorage
      state.sysConfig = sysConfig;
      localStorage.setItem("sysConfig", JSON.stringify(sysConfig));
    },
    loadCurrentAdmin(state, user) {  // 加载当前管理员信息，并保存到localStorage
      state.currentAdmin = user;
      localStorage.setItem("currentAdmin", JSON.stringify(user));
    },
    // 加载网站信息，并处理一些特殊字段（如将webTitle分割成数组，将notices和randomCover解析为JSON对象），然后保存到localStorage
    loadWebInfo(state, webInfo) {
      webInfo.webTitle = webInfo.webTitle.split('');
      webInfo.notices = JSON.parse(webInfo.notices);
      webInfo.randomCover = JSON.parse(webInfo.randomCover);
      state.webInfo = webInfo;
      localStorage.setItem("webInfo", JSON.stringify(webInfo));
    }
  },
  // actions对象用于处理异步操作，并提交mutation来更新state（在这个例子中，actions对象是空的，意味着没有异步操作）
  actions: {},  
  // modules对象用于将状态分割成模块（在这个例子中，modules对象也是空的，意味着没有分割状态）
  modules: {},
  // plugins数组用于注册Vuex插件（在这个例子中，plugins数组也是空的，意味着没有注册插件）
  plugins: []
})
